perm filename SCANER.SAI[SYS,HE] blob sn#083091 filedate 1974-01-28 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00009 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	ENTRY XTENT
C00005 00003	⊃	DDVID OVERLAY CODE
C00007 00004	⊃	CHANGE CLIP LEVEL MAX. DIFF. AND SET CLIPS TO IT
C00012 00005	⊃	TEST FOR RASTER SCAN FOR ACOMTEST.
C00018 00006	⊃	ENTRY TO ACCOMODATE WHEN AN EDGE IS LOST DURING A RASTER SCAN
C00020 00007	⊃	ENTRY TO ACCOMODATE WHEN AN EDGE IS LOST WHILE TRACING
C00025 00008	⊃  VERIFIES  THAT  DETECTED  DISCONTINUITY  BELONGS TO AN OBJECT EDGE OF
C00029 00009	⊃ 	TEST WHETHER I2 (NEXT SCAN POINT) DIFFERS
C00031 ENDMK
C⊗;
ENTRY XTENT;
BEGIN "SCNER" COMMENT ACCOMODATION ROUTINES;
REQUIRE "PREAMB.SAI[SYS,HE]" SOURCE_FILE;
REQUIRE "DPYSUB.HDR[SYS,HE]" SOURCE_FILE;
REQUIRE 500 STRING_SPACE;

EXTERNAL PROCEDURE SENSINIT(BOOLEAN FLAG);
EXTERNAL BOOLEAN PROCEDURE ACC(BOOLEAN PROCEDURE T;BOOLEAN F;INTEGER C,M);
EXTERNAL INTEGER PROCEDURE GETPNT(INTEGER X,Y);
EXTERNAL PROCEDURE INTPNT;
EXTERNAL PROCEDURE TVIN;
EXTERNAL INTEGER PROCEDURE GENTER(INTEGER X,Y; REFERENCE BOOLEAN O;
	REFERENCE INTEGER D);
EXTERNAL INTEGER PROCEDURE DDACO(INTEGER DAC);
EXTERNAL INTEGER PROCEDURE YOPER(INTEGER X,Y; REFERENCE INTEGER ANG;
	INTEGER CW; STRING TRAC,FLAG);
EXTERNAL PROCEDURE DEBWAIT;
EXTERNAL PROCEDURE DDVID(STRING STR);
EXTERNAL INTEGER PROCEDURE GIOWD(INTEGER ARRAY BUG);
EXTERNAL PROCEDURE OVERL(INTEGER ARRAY BUF;INTEGER N,M,L,EXP;BOOLEAN CHAN);

DEFINE CRLF="'15&'12",⊃="COMMENT", TVRESET="STVFL←0", SAFEX="",
	TVX(X)="(X)*3.0-512.0", TVY(Y)="512.0-(Y)*3.0";
EXTERNAL BOOLEAN ACCOMINIT, DEBDEL, DDFLAG, NOWAIT;
EXTERNAL SHORT INTEGER BCLIP, TCLIP, FLINE, LLINE, RSIDE, LSIDE, TMAX,
	BMAX, LSMAX, RSMAX, STVFL, IWID, TVCAM, GTHRES, CLDIFF, DEBFRM,
	TVWORD, ST, LINLEN;
EXTERNAL STRING JOB;
EXTERNAL REAL OD, OB;
SHORT INTEGER INT,INT2,KKP,CLIPDIF,I1,I2,CW,X2,Y2,DIR,X1,Y1,LENSAV,WIDSAV;
INTERNAL BOOLEAN SCAN_ACC, SCAN_DIR;
BOOLEAN INTOK;
SAFE INTEGER ARRAY DISPL[1:100], BUF[1:10];

SIMPLE PROCEDURE OUTCLIP(STRING LAB);
	IF TYP_EDGE THEN
		OUTSTR(LAB&" TCLIP="&CVS(TCLIP)&"  BCLIP="&CVS(BCLIP)&CRLF);

⊃	CHECK CLIP LEVEL AND ADJUST IF CHANGED;
	
SIMPLE INTERNAL PROCEDURE REINIT;
	IF ABS(TCLIP-BCLIP)<CLIPDIF THEN
		BEGIN
		TCLIP←(7-CLIPDIF) DIV 2;
		BCLIP←TCLIP+CLIPDIF;
		TVRESET;
		OUTCLIP("REINIT");
		END;
⊃	DDVID OVERLAY CODE;

INTERNAL PROCEDURE DDSTART;
	IF ST THEN DDVID("E;→1;↔1;F1,1;L0") ELSE
	BEGIN SAFE INTEGER ARRAY BUF[1:(((RSMAX-LSMAX+1) DIV 9)+1)*
		(BMAX-TMAX+1)];
	INTEGER TV,TC,BC,RS,LS,FL,LL;
	TV ← TVWORD;
 	TC ← TCLIP;
	BC ← BCLIP;
	RS ← RSIDE;	LS ← LSIDE;	FL ← FLINE;	LL ← LLINE;
	TVWORD ← GIOWD(BUF);
	TCLIP ← 0;
	BCLIP ← 7;
	RSIDE ← RSMAX;	LSIDE ← LSMAX;	FLINE ← TMAX;	LLINE ← BMAX;
	TVIN;
	LENSAV ← LINLEN;
	WIDSAV ← IWID;
	DDVID("E;→1;↔1;F1,1;L0");
	TVWORD ← TV;
	BC ← BCLIP;
	TC ← TCLIP;
	RSIDE ← RS;	LSIDE ← LS;	FLINE ← FL;	LLINE ← LL;
	END;

INTERNAL SIMPLE PROCEDURE OVERPLT(INTEGER X1, Y1, X2, Y2);
	BEGIN
	INTEGER RS,LS,FL,LL,LIS,WS,OV;
	DPYSET(BUF);
	DPYBRT(0);
	OV ← OVERLAY;
	RS ← RSIDE;	LS ← LSIDE;	FL ← FLINE;	LL ← LLINE;
	LIS ← LINLEN;
	WS ← IWID;
	RSIDE ← RSMAX;	LSIDE ← LSMAX;	FLINE ← TMAX;	LLINE ← BMAX;
	OVERLAY ← FALSE;
	LINLEN ← LENSAV;
	IWID ← WIDSAV;
	APT(X1-LSIDE,Y1-FLINE);
	IF X2 THEN APT(X2-LSIDE,Y2-FLINE);
	DPYPARS;
	OVERL(BUF,1,1,0,1,FALSE);
	RSIDE ← RS;	LSIDE ← LS;	FLINE ← FL;	LLINE ← LL;
	OVERLAY ← OV;
	LINLEN ← LIS;
	IWID ← WS;
	END;
⊃	CHANGE CLIP LEVEL MAX. DIFF. AND SET CLIPS TO IT;

SIMPLE INTERNAL PROCEDURE CLIPCHG(INTEGER DIF);
	BEGIN
	IF DIF<0 THEN DIF←0;
	IF DIF>7 THEN DIF←7;
	CLIPDIF ← DIF;
	REINIT;
	END;

⊃	DEBUGGING ROUTINES;

SIMPLE PROCEDURE SHOW(STRING FOO; INTEGER X1,Y1,X2,Y2,BOOLN);
	BEGIN INTEGER DISSAVE;
	DISSAVE ← DPYPARS;
	DPYSET(DISPL);
	DPYBRT(3);
	DPYBIG(3);
	SETFORMAT(3,0);
	IF DEBDEL THEN
		BEGIN "DELAY"
		AIVECT(-512,400);
		DPYSST(FOO&"   VALUE="&(IF BOOLN THEN "TRUE" ELSE "FALSE")
			&CRLF&"TCLIP="&CVS(TCLIP)&"    BCLIP="&CVS(BCLIP)&
			CRLF&"DAC="&CVS(DAC_ACC)&"   AUTO_ACC ="&
			CVS(AUTO_ACC)&CRLF&"INT1="&CVS(I1)&
			"   INT2="&CVS(I2)&CRLF&"CHANGE= "&
			(IF CHANGE_ACC THEN "TRUE" ELSE "FALSE"));
		END "DELAY";
	APT(TVX(X1),TVY(Y1));
	APT(TVX(X2),TVY(Y2));
	DPYOUT(DEBFRM);
	IF DDFLAG∧¬NOWAIT THEN OVERPLT(X1,Y1,X2,-Y2);
	DPYRESET(DISSAVE);
	DEBWAIT;
	END;
⊃	TEST FOR RASTER SCAN FOR ACOMTEST.
	X2, Y2 MUST BE SET BEFORE CALLING;

SIMPLE BOOLEAN PROCEDURE TEST1(REFERENCE SHORT INTEGER A,B);
	BEGIN SHORT INTEGER I, J, RET;
	IF ¬INTOK THEN
		BEGIN
		A ← I1 ← GENTER(X1, Y1, J←-1,I);
		B ← I2 ← GENTER(X2, Y2, J←-1,I);
		END ELSE BEGIN
		INTOK←FALSE;
		A ← I1;
		B ← I2;
		END;
	RET ← ABS(I1-I2)≥GTHRES∨
		((I1 MIN I2)>0∧(I1 MAX I2)<15∧BCLIP-TCLIP≤CLDIFF);
	IF DEB_EDGE THEN SHOW("ACCOM-COARSE RASTER",X1,Y1,X2,Y2,RET);
	RETURN(RET);
	END;

⊃	TEST FOR EDGE TRACING. TRAC, CW MUST BE SET BEFORE CALLING;

SIMPLE BOOLEAN PROCEDURE TEST2(REFERENCE SHORT INTEGER A,B);
	BEGIN SHORT INTEGER I,COH;
	IF ¬INTOK THEN COH ← YOPER(X1, Y1, DIR, CW, "ACCOM-TRACING",I←0);
	INTOK ← FALSE;
	A ← OD+.5;
	B ← OB+.5;
	RETURN(COH=3);
	END;

⊃	TEST FOR RASTER SCAN FOR FINEAC.  X2, Y2 MUST BE SET BEFORE CALLING;

SIMPLE BOOLEAN PROCEDURE TEST3(REFERENCE SHORT INTEGER A,B);
	BEGIN SHORT INTEGER I, J, RET;
	IF ¬INTOK THEN
		BEGIN
		A ← I1 ← GENTER(X1, Y1, J←-1, I);
		B ← I2 ← GENTER(X2, Y2, J←-1, I);
		END ELSE BEGIN
		INTOK ← FALSE;
		A ← I1;
		B ← I2;
		END;
	RET ← ABS(I1-I2)≥GTHRES;
	IF DEB_EDGE THEN SHOW("ACCOM-FINE RASTER",X1,Y1,X2,Y2,RET);
	RETURN(RET);
	END;
⊃	ENTRY TO ACCOMODATE WHEN AN EDGE IS LOST DURING A RASTER SCAN;

SIMPLE INTERNAL BOOLEAN PROCEDURE FINEAC(SHORT INTEGER XX,YY,X,Y,INT,INT2);
	BEGIN
	X1 ← XX;
	Y1 ← YY;
	X2 ← X;
	Y2 ← Y;
	I1 ← INT;
	I2 ← INT2;
	INTOK ← TRUE;
	RETURN(ACC(TEST3,TYP_EDGE,CLIPDIF,3));
	END;

⊃	ENTRY TO KEEP RASTER INTERSECTION IN BOUNDS;

SIMPLE INTERNAL BOOLEAN PROCEDURE ACOMTEST(REFERENCE SHORT INTEGER INT, INT2;
		SHORT INTEGER X,Y,LX,LY);
	BEGIN
	SHORT INTEGER A, B, C, TST;
	A ← TCLIP;
	B ← BCLIP;
	C ← DAC_ACC;
	X1 ← X;
	Y1 ← Y;
	X2 ← LX;
	Y2 ← LY;
	I1 ← INT;
	I2 ← INT2;
	INTOK ← TRUE;
	ACC(TEST1,TYP_EDGE,CLIPDIF,3);
	INT ← I1;
	INT2 ← I2;
	IF BCLIP-TCLIP<CLIPDIF THEN
		BEGIN
		TCLIP ← (TCLIP+BCLIP+CLIPDIF) DIV 2;
		BCLIP ← TCLIP+CLIPDIF;
		IF BCLIP>7 THEN BEGIN BCLIP←7;TCLIP←7-CLIPDIF;END;
		IF TCLIP<0 THEN BEGIN TCLIP←0;BCLIP←CLIPDIF;END;
		END;
	TST ← A≠TCLIP∨B≠BCLIP∨C≠DAC_ACC;
	RETURN(TST);
	END;
⊃	ENTRY TO ACCOMODATE WHEN AN EDGE IS LOST WHILE TRACING;

SIMPLE INTERNAL BOOLEAN PROCEDURE ACCOMO(SHORT INTEGER X,Y;
		REFERENCE SHORT INTEGER ANGLE,CWX);
	BEGIN
	BOOLEAN T;
	X1 ← X;
	Y1 ← Y;
	INTOK ← TRUE;
	CW ← CWX;
	T ← ACC(TEST2,TYP_EDGE,CLIPDIF,5);
	ANGLE ← DIR;
	RETURN(T);
	END;
⊃  VERIFIES  THAT  DETECTED  DISCONTINUITY  BELONGS TO AN OBJECT EDGE OF
   SUFFICIENT EXTENT THAT ATLEAST 14 POINTS IN A 4*4 RECT.  WHOSE  UPPER
   OR  LOWER  LEFT HAND CORNER IS THE FIRST POINT THAT DIFFERED FROM THE
   BACKGROUND ALSO DIFFER FROM THE BACKGROUND BY AT LEAST AS MUCH. XINCR
   IS  SIGNED  INCREMENT  IN  X DIRECTION, SIGFLAG IS TRUE IF OBJECT(2ND
   SAMPLE IN DIRECTION OF SCAN) IS BRIGHTER THAN BACKGROUND;
	
DEFINE	RSET(X)="BEGIN IF TST THEN
			BEGIN
			FLINE←XT;
			LLINE←XB;
			LSIDE←XL;
			RSIDE←XR;
			TVIN;
			END;
		RETURN(X);
		END";

SIMPLE INTERNAL BOOLEAN PROCEDURE XTENT(SHORT INTEGER X,Y,XINCR;
		BOOLEAN SIGFLAG);
	BEGIN "XTNT"
	SHORT INTEGER K,L,COUNT1,COUNT2, STEPX,T,B,LL,R,XT,XB,XL,XR,TST,
		SIDER,SIDEL,LINEF,LINEL,ND,INC;
	XT←FLINE; XB←LLINE; XL←LSIDE; XR←RSIDE;
	TST←FALSE;
	STEPX ← IF SIGFLAG THEN 1 ELSE -1;
	B←LINEL←(BMAX-1) MIN (Y+4);
	T←LINEF←(Y-4) MAX (TMAX+1);
	IF XINCR>0 THEN 
		BEGIN
		INC←1;
		LL←SIDEL←(LSMAX+1) MAX (X-XINCR-3);
		R←SIDER←(RSMAX-1) MIN (X+3);
		END ELSE BEGIN
		INC←-1;
		R←SIDEL←(RSMAX-1)MIN (X-XINCR+3);
		LL←SIDER←(LSMAX+1) MAX (X-3);
		END;
	COUNT1←COUNT2←INT2←INT←0;
	IF B>LLINE∨T<FLINE∨LL<LSIDE∨R>RSIDE THEN
		BEGIN
		LLINE←B;
		FLINE←T;
		LSIDE←LL;
		RSIDE←R;
		TVIN;
		TST←TRUE;
		INTPNT;
		END;
	LINEL←LINEL-FLINE;
	LINEF←LINEF-FLINE;
	SIDEL←SIDEL-LSIDE;
	SIDER←SIDER-LSIDE;
	ND←SIDEL+INC*3;
	FOR K←SIDEL STEP INC UNTIL ND  DO
		BEGIN
		FOR L←LINEF STEP 1 UNTIL LINEF+3  DO
			BEGIN
			INT←INT+GETPNT(K,L);
			COUNT1 ← COUNT1+1;
			END;
		FOR L←LINEF+5 STEP 1 UNTIL LINEL DO
			BEGIN
			INT2←INT2+GETPNT(K,L);
			COUNT2 ← COUNT2+1;
			END;
		END;
	INT ← INT/COUNT1+.5;
	INT2←INT2/COUNT2+.5;
	INT ← IF SIGFLAG THEN INT MIN INT2 ELSE INT MAX INT2;
	ND←SIDER-INC*3;
	COUNT2 ← COUNT1←0;
	FOR K←ND STEP INC UNTIL SIDER DO
	   FOR L←LINEF STEP 1 UNTIL LINEF+3 DO
		BEGIN "XT2" 
		INT2←GETPNT(K,L);
		IF ABS(INT2-INT)≥GTHRES THEN COUNT1 ← COUNT1+1;
		COUNT2 ← COUNT2+1;
		END "XT2";
	IF COUNT2-COUNT1<GTHRES THEN RSET(TRUE);
	COUNT1 ← COUNT2←0;
	FOR K←ND STEP INC UNTIL SIDER DO
		FOR L←LINEF+5 STEP 1 UNTIL LINEL DO
		BEGIN "XT5" 
		INT2←GETPNT(K,L) ;
		IF ABS(INT2-INT)≥GTHRES THEN COUNT2 ← COUNT2+1;
		COUNT1 ← COUNT1+1;
		END "XT5";
	RSET(COUNT1-COUNT2<3);
	END "XTNT";
⊃ 	TEST WHETHER I2 (NEXT SCAN POINT) DIFFERS
		IN THE RIGHT WAY FROM I1 TO AN EXTENT SUFFICIENT
		TO CONSTITUTE A POSSIBLE EDGE;

SIMPLE INTERNAL BOOLEAN PROCEDURE DISCON(INTEGER II1,II2,X1,Y1,X2,Y2);
	BEGIN "DISCO" INTEGER RET;
	I1←II1;
	I2←II2;
	RET ← ABS(I2-I1)≥GTHRES;
	IF DEB_EDGE THEN SHOW("DISCON",X1,Y1,X2,Y2,RET);
	RETURN(RET);
	END "DISCO";

⊃	CALLED AT START OF RUN;

SIMPLE INTERNAL INTEGER PROCEDURE SCANINIT;
	BEGIN "INIT"
	IF TVCAM=1 THEN
		BEGIN "ACCOM"
		IF DAC_ACC<0 THEN DDACO(-DAC_ACC);
		SCAN_DIR ← 0;
		IF (¬SENSCAL_ACC∨CHANGE_ACC) THEN SENSINIT(TYP_EDGE);
		END "ACCOM" ELSE BEGIN
		CHANGE_ACC←FALSE;
		SENSCAL_ACC←TRUE;
		DAC_ACC←AUTO_ACC←30;
		END;
	TCLIP ← BCLIP ← 5;
	CLIPCHG(CLDIFF);
	END "INIT";

⊃	INSERT VERIFIER CODE HERE;

DEFINE	DISTST="TRUE",
	CALL_JOB="JOB",
	THIS_JOB="""EDGE""",
	DEB_JOB="DEB_EDGE",
	TYP_JOB="TYP_EDGE";

REQUIRE "VERIFY.SAI[SYS,HE]" SOURCE_FILE;

END "SCNER";